/* Объявление глобального объединения */

/* Это объединение позволяет получить отдельный доступ
   к младшему и старшему байту двухбайтного целого числа */

union union_int
{
unsigned int int_number;
unsigned char byte_int[2];
} un_int;

/* В этом объединении массив char byte_int, состоящий из двух элементов
   byte_int[0] и byte_int[1], занимает в памяти ровно столько же места
   (2 х 1 байт), сколько и целая переменная number_int (2 байта). Т.е.
   объединение un_int занимает в SRAM 2 байта */

/* Основная функция программы */

void main(void)
{
unsigned int num_int; 		// Объявляем локальную целую
// переменную num_int
unsigned char lsb_num_int; 	// Объявляем локальную символьную
// переменную lsb_num_int (это будет
// младший байт целого числа)
unsigned char msb_num_int; 	// Объявляем локальную символьную
// переменную msb_num_int (это будет
// старший байт целого числа)

/* Определим указатель point объединения union_int
   с помощью знака (*), т.е. зададим его тип.
   Его тип соответствует типу объединения */

union union_int *point;

/* Зададим значение переменной, доступ к байтам которой
   требуется осуществить */

num_int=0x3FA4;

/* прямой доступ к элементам объединения */

un_int.int_number=num_int; 	// присваиваем значение переменной
// num_int элементу int_number
// объединения un_int

/* Объединение un_int занимает в SRAM 16 бит (2 байта),
   т.к. такой размер имеют оба элемента объединения -
   переменная int и массив char (см. табл. 25, стр. 313). Теперь в
   эту область памяти записано число 0x3FA4 */

/* Присваиваем переменной lsb_num_int значение элемента
   byte_int[0] объединения un_int. Значение этого элемента
   будет соответствовать числу, записанному в младших 8 битах
   (в младшем байте) области памяти, выделенной под
   объединение un_int, т.е. lsb_num_int=0xA4.
   Таким образом, переменная lsb_num_int принимает значение
   младшего байта переменной num_int */

lsb_num_int=un_int.byte_int[0];

/* Присваиваем переменной msb_num_int значение элемента
   byte_int[1] объединения un_int. Значение этого элемента
   будет соответствовать числу, записанному в старших 8 битах
   (в старшем байте) области памяти, выделенной под
   объединение un_int, т.е. msb_num_int=0x3F.
   Таким образом, переменная msb_num_int принимает значение
   старшего байта переменной num_int */

msb_num_int=un_int.byte_int[1];

/* Тот же доступ к элементам объединения, используя указатель */

point=&un_int; 			// Инициализируем указатель с
// адресом объединения un_int
point->int_number=num_int; 	// Получим i1=12
lsb_num_int=point->byte_int[0]; 	// Присваиваем переменной
// lsb_num_int значение
// младшего байта
// переменной num_int

msb_num_int=point->byte_int[1]; 	// Присваиваем переменной
// msb_num_int значение
// старшего байта
// переменной num_int
}
